/*
* @(#) UnBlockingStack2.java 2018年01月30日
*
* Copyright 2010 NetEase.com, Inc. All rights reserved.
*/
package com.leo.m1801.d30;

import com.leo.common.Node;

import java.util.concurrent.atomic.AtomicReference;

/**
 *
 * @author xuexiaolei
 * @version 2018年01月30日
 */
public class UnBlockingStack2<E> {
    AtomicReference<Node<E>> top = new AtomicReference<Node<E>>();
    public E pop(){
        Node<E> topNode,nextNode;
        do {
            topNode = top.get();
            if (topNode == null) { return null; }
            nextNode = topNode.next;
        }while (!top.compareAndSet(topNode, nextNode));
        return  topNode.value;
    }

    public void push(E value){
        Node<E> newNode = new Node<E>(value);
        Node<E> topNode;
        do {
            topNode = top.get();
            newNode.next = topNode;
        }while (!top.compareAndSet(topNode, newNode));
    }
}
